﻿/************************************************************************

   Extended Silverlight Toolkit

   Copyright (C) 2010-2012 Xceed Software Inc.

   This program is provided to you under the terms of the Microsoft Public
   License (Ms-PL) as published at http://extendedsilverlight.codeplex.com/license

   Please purchase a commercial version of this toolkit if you are using
   it in a commercial product. The commercial versions support the project,
   and also include more features for each control, priority support,
   source code, updates, removed watermark, and a proprietary license.

   Visit http://xceed.com and follow @datagrid on Twitter.

  **********************************************************************/

using System;
using System.Windows;
using System.Windows.Media;

namespace Xceed.Silverlight.DataGrid
{
  internal static class ControlExtensions
  {
    internal static bool IsRecycled( this ControlBase source )
    {
      return ControlExtensions.IsWithinRecycledPart( source, null );
    }

    internal static bool IsRecycled( this ControlBase source, DependencyObject upTo )
    {
      if( upTo == null )
        throw new ArgumentNullException( "upTo" );

      return ControlExtensions.IsWithinRecycledPart( source, upTo );
    }

    internal static bool IsRecycled( this ContentControlBase source )
    {
      return ControlExtensions.IsWithinRecycledPart( source, null );
    }

    internal static bool IsRecycled( this ContentControlBase source, DependencyObject upTo )
    {
      if( upTo == null )
        throw new ArgumentNullException( "upTo" );

      return ControlExtensions.IsWithinRecycledPart( source, upTo );
    }

    private static bool IsWithinRecycledPart( DependencyObject element, DependencyObject upTo )
    {
      while( element != null )
      {
        if( ControlExtensions.IsRecycledPart( element ) )
          return true;

        if( element == upTo )
          break;

        element = VisualTreeHelper.GetParent( element );
      }

      return false;
    }

    private static bool IsRecycledPart( DependencyObject element )
    {
      IRecyclable recyclable = element as IRecyclable;

      return ( recyclable != null )
          && ( recyclable.IsRecycled );
    }
  }
}
